服務提供者是 Laravel 中重要的元件,它們負責將各種服務和功能綁定到 Laravel 的服務容器中。
文件:服务提供者
服務提供者角色: 負責註冊和引導服務,綁定服務到服務容器。
建立服務提供者: 使用Artisan命令生成,並在其中定義服務的綁定和引導邏輯。
註冊服務提供者: 在config/app.php檔案中註冊自訂服務提供者。
使用服務提供者: 在應用程式中使用app()輔助函數取得服務實例,並呼叫其方法。
服務提供者是 Laravel 中的核心元件之一,它們負責配置和綁定應用程式所需的各種服務,例如:資料庫連接、路由、快取等;在 Laravel 應用程式中,服務提供者的主要職責包括:
創建服務提供者
使用 Artisan 指令 php artisan make:provider CustomServiceProvider 建立自訂服務提供者,在 app/Providers/CustomServiceProvider.php 中編輯註冊和引導服務:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class CustomServiceProvider extends ServiceProvider
{
    // 註冊服務
    public function register()
    {
        // 綁定服務到服務容器
        $this->app->singleton('CustomService', function ($app) {
            return new \App\Services\CustomService();
        });
    }
    // 引導服務
    public function boot()
    {
        // 可以在這裡執行其他啟動操作
    }
}
建立服務類
// app/Services/CustomService.php
namespace App\Services;
class CustomService
{
    public function performTask()
    {
        return 'Task performed!';
    }
}
註冊服務提供者
在 config/app.php 中註冊服務提供者:
// config/app.php
'providers' => [
    // Other Service Providers
    App\Providers\CustomServiceProvider::class,
],
使用服務提供者
在控制器或其他地方,可以透過服務容器來取得和使用綁定的服務:
// 在控制器中使用服務
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
class TestController extends BaseController
{
    public function index()
    {
        // 取得 CustomService 實例
        $customService = app('CustomService');
        $result = $customService->performTask();
        return $result; // 輸出 'Task performed!'
    }
}
從零開始建立一個服務提供者可以提供 say_hello 的服務
step 1:建立服務提供者
指令 php artisan make:provider MyServiceProvider,接著會在 app/Providers 目錄下看到一個 MyServiceProvider.php 的文件
step 2:編輯服務提供者
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class MyServiceProvider extends ServiceProvider
{
    /**
     * 引導應用程式的服務。
     *
     * @return void
     */
    public function boot(): void
    {
        // 這裡可以註冊事件或路由等
    }
    /**
     * 註冊應用程式的服務。
     *
     * @return void
     */
    public function register(): void
    {
        // 這裡可以綁定服務或創建單例等
        $this->app->singleton('my_service', function ($app) {
            return new \App\Services\MyService();
        });
    }
}
step 3:創建服務類
這裡比較特別,因為專案建立本來就沒有 Services 的資料夾,所以要自己建立並且生成新的 class,其實也可以直接寫在 controller 中,只是隨著內容愈來愈多,可以把商業邏輯封裝到服務類這樣比較好維護和管理!
mkdir app/Services
touch app/Services/MyService.php
step 4:編輯服務類
<?php
namespace App\Services;
class MyService
{
    public function greet($name)
    {
        return "Hello, $name!";
    }
}
step 5:註冊服務提供者
在 config/app.php 中,將你剛剛創建的服務提供者添加到 providers 陣列
'providers' => [
    // 其他服務提供者...
    App\Providers\MyServiceProvider::class,
],
step 6:在控制器中呼叫服務類啟用
php artisan make:controller MyController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class MyController extends Controller
{
    protected $myService;
    public function __construct()
    {
        $this->myService = app('my_service');
    }
    public function index()
    {
        return $this->myService->greet('World');
    }
}
step 7:定義路由
use App\Http\Controllers\MyController;
Route::get('/greet', [MyController::class, 'index']);
step 8:啟服務測試
php artisan serve
postman 呼叫 http://localhost:8000/api/greet,可以看到 "Hello, World!"。